"""
创建可管理的属性

问题：
    你想给某个实例attribute增加除访问与修改之外的其他处理逻辑，比如类型检查或合法性验证。
解决方案：
    自定义某个属性的一种简单方法是将它定义为一个property。
"""


class User:
    def __init__(self):
        self._user_name = None

    @property
    def user_name(self):
        """
        getter
        """

        return self._user_name

    @user_name.setter
    def user_name(self, value):
        """
        setter
        """

        if not isinstance(value, str):
            raise TypeError("Expected a string")

        self._user_name = value

    @user_name.deleter
    def user_name(self):
        raise AttributeError("Can't delete attribute")

    def __str__(self):
        return "({0._user_name!s})".format(self)


def use_user():
    user = User()
    user.user_name = "kevin"
    print(user.user_name)
    print(user)
    # del user.user_name
    # 输出结果：
    """
    kevin
    (kevin)
    """


if __name__ == '__main__':
    use_user()
